<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN" "http://www.w3.org/TR/html4/strict.dtd">
<html><head>
<meta http-equiv="content-type" content="text/html; charset=UTF-8">
<title>Count The Number Of Rows Modified</title>
<style type="text/css">
body {
    margin: auto;
    font-family: Verdana, sans-serif;
    padding: 8px 1%;
}

a { color: #044a64 }
a:visited { color: #734559 }

.logo { position:absolute; margin:3px; }
.tagline {
  float:right;
  text-align:right;
  font-style:italic;
  width:300px;
  margin:12px;
  margin-top:58px;
}

.toolbar {
  text-align: center;
  line-height: 1.6em;
  margin: 0;
  padding: 0px 8px;
}
.toolbar a { color: white; text-decoration: none; padding: 6px 12px; }
.toolbar a:visited { color: white; }
.toolbar a:hover { color: #044a64; background: white; }

.content    { margin: 5%; }
.content dt { font-weight:bold; }
.content dd { margin-bottom: 25px; margin-left:20%; }
.content ul { padding:0px; padding-left: 15px; margin:0px; }

/* rounded corners */
.se  { background: url(../images/se.gif) 100% 100% no-repeat #044a64}
.sw  { background: url(../images/sw.gif) 0% 100% no-repeat }
.ne  { background: url(../images/ne.gif) 100% 0% no-repeat }
.nw  { background: url(../images/nw.gif) 0% 0% no-repeat }

/* Things for "fancyformat" documents start here. */
.fancy img+p {font-style:italic}
.fancy .codeblock i { color: darkblue; }
.fancy h1,.fancy h2,.fancy h3,.fancy h4 {font-weight:normal;color:#044a64}
.fancy h2 { margin-left: 10px }
.fancy h3 { margin-left: 20px }
.fancy h4 { margin-left: 30px }
.fancy th {white-space:nowrap;text-align:left;border-bottom:solid 1px #444}
.fancy th, .fancy td {padding: 0.2em 1ex; vertical-align:top}
.fancy #toc a        { color: darkblue ; text-decoration: none }
.fancy .todo         { color: #AA3333 ; font-style : italic }
.fancy .todo:before  { content: 'TODO:' }
.fancy p.todo        { border: solid #AA3333 1px; padding: 1ex }
.fancy img { display:block; }
.fancy :link:hover, .fancy :visited:hover { background: wheat }
.fancy p,.fancy ul,.fancy ol { margin: 1em 5ex }
.fancy li p { margin: 1em 0 }
/* End of "fancyformat" specific rules. */

</style>
  
</head>
<body>
<div><!-- container div to satisfy validator -->

<a href="../index.html">
<img class="logo" src="../images/sqlite370_banner.gif" alt="SQLite Logo"
 border="0"></a>
<div><!-- IE hack to prevent disappearing logo--></div>
<div class="tagline">Small. Fast. Reliable.<br>Choose any three.</div>

<table width=100% style="clear:both"><tr><td>
  <div class="se"><div class="sw"><div class="ne"><div class="nw">
  <table width=100% style="padding:0;margin:0;cell-spacing:0"><tr>
  <td width=100%>
  <div class="toolbar">
    <a href="../about.html">About</a>
    <a href="../sitemap.html">Sitemap</a>
    <a href="../docs.html">Documentation</a>
    <a href="../download.html">Download</a>
    <a href="../copyright.html">License</a>
    <a href="../news.html">News</a>
    <a href="../support.html">Support</a>
  </div>
<script>
  gMsg = "Search SQLite Docs..."
  function entersearch() {
    var q = document.getElementById("q");
    if( q.value == gMsg ) { q.value = "" }
    q.style.color = "black"
    q.style.fontStyle = "normal"
  }
  function leavesearch() {
    var q = document.getElementById("q");
    if( q.value == "" ) { 
      q.value = gMsg
      q.style.color = "#044a64"
      q.style.fontStyle = "italic"
    }
  }
</script>
<td>
    <div style="padding:0 1em 0px 0;white-space:nowrap">
    <form name=f method="GET" action="http://www.sqlite.org/search">
      <input id=q name=q type=text
       onfocus="entersearch()" onblur="leavesearch()" style="width:24ex;padding:1px 1ex; border:solid white 1px; font-size:0.9em ; font-style:italic;color:#044a64;" value="Search SQLite Docs...">
      <input type=submit value="Go" style="border:solid white 1px;background-color:#044a64;color:white;font-size:0.9em;padding:0 1ex">
    </form>
    </div>
  </table>
</div></div></div></div>
</td></tr></table>
<div class=startsearch></div>
  
<a href="intro.html"><h2>SQLite C Interface</h2></a><h2>Count The Number Of Rows Modified</h2><blockquote><pre>int sqlite3_changes(sqlite3*);
</pre></blockquote><p>
This function returns the number of database rows that were changed
or inserted or deleted by the most recently completed SQL statement
on the <a href="../c3ref/sqlite3.html">database connection</a> specified by the first parameter.
Only changes that are directly specified by the <a href="../lang_insert.html">INSERT</a>, <a href="../lang_update.html">UPDATE</a>,
or <a href="../lang_delete.html">DELETE</a> statement are counted.  Auxiliary changes caused by
triggers or <a href="../foreignkeys.html#fk_actions">foreign key actions</a> are not counted. Use the
<a href="../c3ref/total_changes.html">sqlite3_total_changes()</a> function to find the total number of changes
including changes caused by triggers and foreign key actions.</p>

<p>Changes to a view that are simulated by an <a href="../lang_createtrigger.html#instead_of_trigger">INSTEAD OF trigger</a>
are not counted.  Only real table changes are counted.</p>

<p>A "row change" is a change to a single row of a single table
caused by an INSERT, DELETE, or UPDATE statement.  Rows that
are changed as side effects of <a href="../lang_replace.html">REPLACE</a> constraint resolution,
rollback, ABORT processing, <a href="../lang_droptable.html">DROP TABLE</a>, or by any other
mechanisms do not count as direct row changes.</p>

<p>A "trigger context" is a scope of execution that begins and
ends with the script of a <a href="../lang_createtrigger.html">trigger</a>.
Most SQL statements are
evaluated outside of any trigger.  This is the "top level"
trigger context.  If a trigger fires from the top level, a
new trigger context is entered for the duration of that one
trigger.  Subtriggers create subcontexts for their duration.</p>

<p>Calling <a href="../c3ref/exec.html">sqlite3_exec()</a> or <a href="../c3ref/step.html">sqlite3_step()</a> recursively does
not create a new trigger context.</p>

<p>This function returns the number of direct row changes in the
most recent INSERT, UPDATE, or DELETE statement within the same
trigger context.</p>

<p>Thus, when called from the top level, this function returns the
number of changes in the most recent INSERT, UPDATE, or DELETE
that also occurred at the top level.  Within the body of a trigger,
the sqlite3_changes() interface can be called to find the number of
changes in the most recently completed INSERT, UPDATE, or DELETE
statement within the body of the same trigger.
However, the number returned does not include changes
caused by subtriggers since those have their own context.</p>

<p>See also the <a href="../c3ref/total_changes.html">sqlite3_total_changes()</a> interface, the
<a href="../pragma.html#pragma_count_changes">count_changes pragma</a>, and the <a href="../lang_corefunc.html#changes">changes() SQL function</a>.</p>

<p>If a separate thread makes changes on the same database connection
while <a href="../c3ref/changes.html">sqlite3_changes()</a> is running then the value returned
is unpredictable and not meaningful.
</p><p>See also lists of
  <a href="objlist.html">Objects</a>,
  <a href="constlist.html">Constants</a>, and
  <a href="funclist.html">Functions</a>.</p>
